
package GUI;

/**
 *
 * @author David Ponce
 * @author Philipp Armbruster
 */


import Interaction.ServerConnection;
import Flightadministration.*;
import Data.*;
import Report.Report;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Vector;
import java.util.Date;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
// Quelle: http://nachocalendar.sourceforge.net/
import net.sf.nachocalendar.CalendarFactory;
import net.sf.nachocalendar.components.DateField;

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;


public class BookingCreate extends JPanel {


    final Main td;
    private JPanel jp;
    public Report r = new Report();
    public DefaultTableModel model1;
    public JTable table1;
    public Vector<Vector> rowData1;
    public Vector<String> columnNames1;
    public DefaultTableModel model2;
    public JTable table2;
    public Vector<Vector> rowData2;
    public Vector<String> columnNames2;
    /*Das AdministrationsObjekt, welches über die getConnection methode vom RMI Server geholt wird, dem "admin" objekt zugewiesen.
    *Dadurch ist eine Kommunikation zwischen GUI und Applikationsserver mittels RMI möglich*/
    final Flightadministration admin = ServerConnection.getConnection();


    // Konstruktor
    public BookingCreate(final Main td) throws RemoteException {

        this.td = td;
        showBookingCreate();
    }


    // Methoden
    public void showBookingCreate() throws RemoteException{

        jp = new JPanel();

        //GridBagLayout
        //**********************************************************************
        GridBagLayout gbl = new GridBagLayout();
        jp.setLayout(gbl);
        jp.setBackground(Color.white);

        GridBagConstraints constraints = new GridBagConstraints();

        constraints.fill = GridBagConstraints.HORIZONTAL;   // wie Komponente Bereich füllen soll
        constraints.weightx = 1;                     // Breite
        constraints.weighty = 1;                    // Höhe
        constraints.insets = new Insets(0,0,1,1);   // Abstände definieren


        //Label
        //**********************************************************************

        JLabel headline = new JLabel("<html><h2 color=blue>Buchung anlegen</h2></html>");
        headline.setHorizontalAlignment(JLabel.CENTER);
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.gridwidth = 3;
        jp.add(headline, constraints);

        JLabel subheadline = new JLabel("<html><p style=\"color:grey; text-align:center\">Um eine Buchung oder einen Dauerauftrag für mehrere Buchungen anzulegen <br>" +
                                                            "wählen Sie bitte eine Flugdurchführung und einen Passagier aus</p></html>");
        subheadline.setHorizontalAlignment(JLabel.CENTER);
        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.gridwidth = 3;
        jp.add(subheadline, constraints);

        // FlightRealizations
        JLabel label2 = new JLabel("Flug auswählen: ");
        constraints.gridx = 0;
        constraints.gridy = 2;
        constraints.gridwidth = 1;
        jp.add(label2, constraints);

        final JComboBox comboBox1 = new JComboBox();
        comboBox1.addItem("Wochentag des Fluges auswählen");
        comboBox1.addItem("Montag");
        comboBox1.addItem("Dienstag");
        comboBox1.addItem("Mittwoch");
        comboBox1.addItem("Donnerstag");
        comboBox1.addItem("Freitag");
        comboBox1.addItem("Samstag");
        comboBox1.addItem("Sonntag");
        constraints.gridx = 1;
        constraints.gridy = 2;
        constraints.gridwidth = 1;
        jp.add(comboBox1, constraints);

        columnNames1 = new Vector<String>();
        columnNames1.add("ID");
        columnNames1.add("Abflugtag");
        columnNames1.add("Abflugdatum");
        columnNames1.add("Abflugsuhrzeit");
        columnNames1.add("Ankunftstag");
        columnNames1.add("Ankunftsdatum");
        columnNames1.add("Ankunftsuhrzeit");
        columnNames1.add("Abflughafen");
        columnNames1.add("Zielflughafen");
        columnNames1.add("Fluglinie");

        // Vector mit nachfolgender for-Schleife mit Werten für JTable belegen
        rowData1 = admin.getAllFlightRealizationsForTable();

        model1 = new DefaultTableModel(rowData1, columnNames1);
        table1 = new JTable(model1) {
            public boolean isCellEditable(int x, int y) {
                return false;
            }
        };
        table1.setModel(model1);
        table1.setAutoCreateRowSorter(true);
        table1.getColumnModel().getColumn(0).setPreferredWidth(10);
        table1.getColumnModel().getColumn(1).setPreferredWidth(50);
        table1.getColumnModel().getColumn(3).setPreferredWidth(25);
        table1.getColumnModel().getColumn(4).setPreferredWidth(50);
        table1.getColumnModel().getColumn(6).setPreferredWidth(25);
        constraints.gridx = 0;
        constraints.gridy = 3;
        constraints.gridwidth = 3;
        table1.setPreferredScrollableViewportSize(new Dimension(550,150));
        table1.setVisible(true);
        jp.add( new JScrollPane(table1), constraints);



        JLabel label4 = new JLabel("Passagier auswählen: ");
        constraints.gridx = 0;
        constraints.gridy = 4;
        jp.add(label4, constraints);

        final JComboBox comboBox2 = new JComboBox();
        comboBox2.addItem("Nachnamenbereich auswählen");
        comboBox2.addItem("Passagiere A-E");
        comboBox2.addItem("Passagiere F-J");
        comboBox2.addItem("Passagiere K-O");
        comboBox2.addItem("Passagiere P-T");
        comboBox2.addItem("Passagiere U-Z");
        constraints.gridx = 1;
        constraints.gridy = 4;
        constraints.gridwidth = 1;
        jp.add(comboBox2, constraints);

        // Vector für Spaltenüberschrift mit Werten belegen
        columnNames2 = new Vector<String>();
        columnNames2.add("ID");
        columnNames2.add("Vorname");
        columnNames2.add("Nachname");
        columnNames2.add("Straße");
        columnNames2.add("Ort");
        columnNames2.add("PLZ");

        // Vector mit allen Airports aus DB
        rowData2 = admin.getAllPassengersForTable();

        model2 = new DefaultTableModel(rowData2, columnNames2);
        model2.addTableModelListener(table2);
        table2 = new JTable(model2) {
            public boolean isCellEditable(int x, int y) {
                return false;
            }
        };
        table2.setModel(model2);
        table2.setAutoCreateRowSorter(true);
        table2.getColumnModel().getColumn(0).setPreferredWidth(10);
        table2.getColumnModel().getColumn(5).setPreferredWidth(50);
        constraints.gridx = 0;
        constraints.gridy = 5;
        constraints.gridwidth = 3;
        constraints.fill = GridBagConstraints.HORIZONTAL;
        table2.setPreferredScrollableViewportSize(new Dimension(400,150));
        table2.setVisible(true);
        jp.add( new JScrollPane(table2), constraints);


        //Buttons
        //**********************************************************************

        JButton button_CreateBooking = new JButton("Buchung anlegen");
        constraints.gridx = 0;
        constraints.gridy = 6;
        constraints.gridwidth = 1;
        jp.add(button_CreateBooking, constraints);

        JButton button_CreateStandingOrderForBookings = new JButton("Dauerauftrag erstellen");
        constraints.gridx = 1;
        constraints.gridy = 6;
        constraints.gridwidth = 1;
        jp.add(button_CreateStandingOrderForBookings, constraints);

        JButton button_Cancel = new JButton("Zurück zur Übersicht");
        constraints.gridx = 2;
        constraints.gridy = 6;
        constraints.gridwidth = 1;
        jp.add(button_Cancel, constraints);


        //Action Listener
        //**********************************************************************

        comboBox1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // Abfragen ob Standardwert ausgewählt ist
                if (comboBox1.getSelectedItem().equals("Wochentag des Fluges auswählen")) {
                    try {
                        updateTableData1();
                    } catch (RemoteException ex) {
                        System.out.println(ex);
                    }
                }
                else {
                    // Wenn nicht, aktuelle FlightRealization aus ComboBox auslesen und Informationen dazu in Label anzeigen
                    JComboBox cb = (JComboBox)e.getSource();
                    Object chosenWeekday = cb.getSelectedItem();
                        String chosenWeekdayAsString = String.valueOf(chosenWeekday);

                            if(chosenWeekdayAsString.equals("Montag")) {
                                try {
                                    rowData1 = admin.getAllFlightRealizationsOnMondayForTable();
                                    // Tabelleninhalt wird aktualisiert
                                    model1.setDataVector(rowData1, columnNames1);
                                } catch (RemoteException ex) {
                                    System.out.println(ex);
                                }
                            } else if(chosenWeekdayAsString.equals("Dienstag")) {
                                try {
                                    rowData1 = admin.getAllFlightRealizationsOnTuesdayForTable();
                                    // Tabelleninhalt wird aktualisiert
                                    model1.setDataVector(rowData1, columnNames1);
                                } catch (RemoteException ex) {
                                    System.out.println(ex);
                                }
                            } else if (chosenWeekdayAsString.equals("Mittwoch")) {
                                try {
                                    rowData1 = admin.getAllFlightRealizationsOnWednesdayForTable();
                                    // Tabelleninhalt wird aktualisiert
                                    model1.setDataVector(rowData1, columnNames1);
                                } catch (RemoteException ex) {
                                    System.out.println(ex);
                                }
                            } else if (chosenWeekdayAsString.equals("Donnerstag")) {
                                try {
                                    rowData1 = admin.getAllFlightRealizationsOnThursdayForTable();
                                    // Tabelleninhalt wird aktualisiert
                                    model1.setDataVector(rowData1, columnNames1);
                                } catch (RemoteException ex) {
                                    System.out.println(ex);
                                }
                            } else if (chosenWeekdayAsString.equals("Freitag")) {
                                try {
                                    rowData1 = admin.getAllFlightRealizationsOnFridayForTable();
                                    // Tabelleninhalt wird aktualisiert
                                    model1.setDataVector(rowData1, columnNames1);
                                } catch (RemoteException ex) {
                                    System.out.println(ex);
                                }
                            } else if (chosenWeekdayAsString.equals("Samstag")) {
                                try {
                                    rowData1 = admin.getAllFlightRealizationsOnSaturdayForTable();
                                    // Tabelleninhalt wird aktualisiert
                                    model1.setDataVector(rowData1, columnNames1);
                                } catch (RemoteException ex) {
                                    System.out.println(ex);
                                }
                            } else if (chosenWeekdayAsString.equals("Sonntag")) {
                                try {
                                    rowData1 = admin.getAllFlightRealizationsOnSundayForTable();
                                    // Tabelleninhalt wird aktualisiert
                                    model1.setDataVector(rowData1, columnNames1);
                                } catch (RemoteException ex) {
                                    System.out.println(ex);
                                }
                            }
                }
            }
        });


        comboBox2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // Abfragen ob Standardwert ausgewählt ist
                if (comboBox2.getSelectedItem().equals("Nachnamenbereich auswählen")) {
                    try {
                        updateTableData2();
                    } catch (RemoteException ex) {
                        System.out.println(ex);
                    }
                }
                else {
                    // Wenn nicht, aktuelle FlightRealization aus ComboBox auslesen und Informationen dazu in Label anzeigen
                    JComboBox cb = (JComboBox)e.getSource();
                    Object chosenLastnameRange = cb.getSelectedItem();
                        String chosenLastnameRangeAsString = String.valueOf(chosenLastnameRange);

                            if(chosenLastnameRangeAsString.equals("Passagiere A-E")) {
                                try {
                                    rowData2 = admin.getAllPassengersFromAtoEForTable();
                                    // Tabelleninhalt wird aktualisiert
                                    model2.setDataVector(rowData2, columnNames2);
                                } catch (RemoteException ex) {
                                    System.out.println(ex);
                                }
                            } else if(chosenLastnameRangeAsString.equals("Passagiere F-J")) {
                                try {
                                    rowData2 = admin.getAllPassengersFromFtoJForTable();
                                    // Tabelleninhalt wird aktualisiert
                                    model2.setDataVector(rowData2, columnNames2);
                                } catch (RemoteException ex) {
                                    System.out.println(ex);
                                }
                            } else if(chosenLastnameRangeAsString.equals("Passagiere K-O")) {
                                try {
                                    rowData2 = admin.getAllPassengersFromKtoOForTable();
                                    // Tabelleninhalt wird aktualisiert
                                    model2.setDataVector(rowData2, columnNames2);
                                } catch (RemoteException ex) {
                                    System.out.println(ex);
                                }
                            } else if(chosenLastnameRangeAsString.equals("Passagiere P-T")) {
                                try {
                                    rowData2 = admin.getAllPassengersFromPtoTForTable();
                                    // Tabelleninhalt wird aktualisiert
                                    model2.setDataVector(rowData2, columnNames2);
                                } catch (RemoteException ex) {
                                    System.out.println(ex);
                                }
                            } else if(chosenLastnameRangeAsString.equals("Passagiere U-Z")) {
                                try {
                                    rowData2 = admin.getAllPassengersFromUtoZForTable();
                                    // Tabelleninhalt wird aktualisiert
                                    model2.setDataVector(rowData2, columnNames2);
                                } catch (RemoteException ex) {
                                    System.out.println(ex);
                                }
                            }
                }
            }
        });


        button_CreateBooking.addActionListener( new ActionListener() {
                @Override
              public void actionPerformed(ActionEvent e ) {
                    if (table1.getSelectedRow()==-1 || table2.getSelectedRow()==-1) {
                        JOptionPane.showMessageDialog(null, "Bitte wählen Sie aus jeder Tabelle eine Zeile aus!");
                    }
                    else {
                        try {
                            // Flugnummer (realizationId) aus JTable auslesen
                            int iSelectedRow1 = table1.getSelectedRow();
                                Object chosenRealizationId = table1.getModel().getValueAt(iSelectedRow1, 0);
                                    int realizationId = Integer.parseInt(String.valueOf(chosenRealizationId));

                                        /* Gesamtsitzplatzanzahl des Fluges auslesen */
                                        int numberOfAllSeatsOfChosenFR = admin.findNumberOfAllSeatsForRealizationId(realizationId);
                                        //Aktuelle Anzahl an Buchungen des ausgewählten Fluges aus der Datenbank auslesen
                                        int currentNumberOfBookingsForChosenFR = admin.findNumberOfBookingsForRealizationId(realizationId);

                            // Kundennummer (passengerId) aus JTable auslesen
                            int iSelectedRow2 = table2.getSelectedRow();
                                Object chosenPassengerId = table2.getModel().getValueAt(iSelectedRow2, 0);
                                    int passengerId = Integer.parseInt(String.valueOf(chosenPassengerId));

                            // Prüfen ob noch Plätze auf dem ausgewählten Flug frei sind
                            if(currentNumberOfBookingsForChosenFR < numberOfAllSeatsOfChosenFR) {

                                // Wenn ja, Buchung anlegen...
                                admin.createBooking(passengerId, realizationId);
                                // ...JTables aktualisieren...
                                td.updateBooking();
                                // ...und entsprechende Meldung an den Benutzer ausgeben
                                JOptionPane.showMessageDialog(null, "Buchung angelegt");
                            }
                            else {
                                // Wenn nein, nur eine entsprechende Meldung an den Benutzer ausgeben
                                JOptionPane.showMessageDialog(null, "<html><p style=\"color:red; text-align: center\">" + 
                                                                    "Leider ist der von Ihnen ausgewählte Flug bereits ausgebucht!" +
                                                                    "</p></html>");
                            }

                            ((CardLayout) td.rightp.getLayout()).show(td.rightp, "BookingM");

                        } catch (RemoteException ex) {
                            System.out.println(ex);
                        }
                    }
               }
        });


        button_CreateStandingOrderForBookings.addActionListener(new ActionListener() {
                @Override
            public void actionPerformed(ActionEvent e){
                if (table1.getSelectedRow()==-1 || table2.getSelectedRow()==-1) {
                        JOptionPane.showMessageDialog(null, "Bitte wählen Sie aus jeder Tabelle eine Zeile aus!");
                }
                else {
                    try {

                        // Flugnummer (realizationId) aus JTable auslesen
                        int iSelectedRow1 = table1.getSelectedRow();
                        Object chosenRealizationId = table1.getModel().getValueAt(iSelectedRow1, 0);
                        int realizationId = Integer.parseInt(String.valueOf(chosenRealizationId));

                        /* Gesamtsitzplatzanzahl des Fluges auslesen */
                        int numberOfAllSeatsOfChosenFR = admin.findNumberOfAllSeatsForRealizationId(realizationId);
                        //Aktuelle Anzahl an Buchungen des ausgewählten Fluges aus der Datenbank auslesen
                        int currentNumberOfBookingsForChosenFR = admin.findNumberOfBookingsForRealizationId(realizationId);

                        // Prüfen ob noch Plätze auf dem ausgewählten Flug frei sind
                        if(currentNumberOfBookingsForChosenFR >= numberOfAllSeatsOfChosenFR) {

                            // Wenn nicht wird eine entsprechende Meldung ausgegeben
                            JOptionPane.showMessageDialog(null, "<html><p style=\"color:red; text-align: center\">" +
                                                                "Leider ist der von Ihnen ausgewählte Flug bereits ausgebucht.<br>" +
                                                                "Somit kann kein Dauerauftrag angelegt werden. Bitte wählen Sie einen anderen Flug aus</p></html>");
                        }
                        else {
                            // Wenn doch, wird das neue JFrame erzeugt in dem der Dauerauftrag angelegt werden kann

                            // Neues Panel für PopUp-Fenster erzeugen
                            JPanel panel = new JPanel();

                            // Neues GridBagLayout erzeugen
                            GridBagLayout gbl = new GridBagLayout();
                            panel.setLayout(gbl);
                            panel.setBackground(Color.white);
                            GridBagConstraints constraints = new GridBagConstraints();
                            constraints.fill = GridBagConstraints.HORIZONTAL;
                            constraints.weightx = 1;
                            constraints.weighty = 1;

                            JLabel label = new JLabel();
                            label.setText("<html><p style=\"color:gray\">" + "Informationen zum ausgewählten Flug" + "<p></html>");
                            constraints.gridwidth = 2;
                            constraints.gridx = 0;
                            constraints.gridy = 1;
                            panel.add(label, constraints);

                            // Label für Fluginformationen erzeugen
                            JLabel label1 = new JLabel();
                            constraints.gridwidth = 2;
                            constraints.gridx = 0;
                            constraints.gridy = 2;
                            panel.add(label1, constraints);

                            JLabel label5 = new JLabel();
                            label5.setText("<html><p style=\"color:gray\">" + "Informationen zum ausgewählten Passagier" + "<p></html>");
                            constraints.gridwidth = 2;
                            constraints.gridx = 0;
                            constraints.gridy = 3;
                            panel.add(label5, constraints);

                            // Label für Passagierinformationen erzeugen
                            JLabel label2 = new JLabel();
                            constraints.gridwidth = 2;
                            constraints.gridx = 0;
                            constraints.gridy = 4;
                            panel.add(label2, constraints);

                            // Label für Kalender erzeugen
                            JLabel label3 = new JLabel();
                            label3.setText("<html><p style=\"color:gray\">" + "Auftragsbeginn:" + "<p></html>");
                            constraints.gridwidth = 1;
                            constraints.gridx = 0;
                            constraints.gridy = 5;
                            panel.add(label3, constraints);

                            // Kalender erzeugen
                            final DateField datefield1 = CalendarFactory.createDateField();
                            constraints.gridwidth = 1;
                            constraints.gridx = 0;
                            constraints.gridy = 6;
                            panel.add(datefield1, constraints);

                            // 2. Label für Kalender erzeugen
                            JLabel label4 = new JLabel();
                            label4.setText("<html><p style=\"color:gray\">" + "Auftragsende:" + "<p></html>");
                            constraints.gridwidth = 1;
                            constraints.gridx = 1;
                            constraints.gridy = 5;
                            panel.add(label4, constraints);

                            // 2. Kalender erzeugn
                            final DateField datefield2 = CalendarFactory.createDateField();
                            constraints.gridwidth = 1;
                            constraints.gridx = 1;
                            constraints.gridy = 6;
                            panel.add(datefield2, constraints);

                            // Button erzeugen
                            JButton button_CreateOrder = new JButton("Auftrag erteilen");
                            constraints.gridwidth = 1;
                            constraints.gridx = 0;
                            constraints.gridy = 7;
                            panel.add(button_CreateOrder, constraints);

                            JButton button_CloseWindow = new JButton("Fenster schließen");
                            constraints.gridwidth = 1;
                            constraints.gridx = 1;
                            constraints.gridy = 7;
                            panel.add(button_CloseWindow, constraints);

                            // ScrollPane erzeugen
                            JScrollPane scrollPane = new JScrollPane();
                            scrollPane.setBounds(new java.awt.Rectangle(450, 350));
                            scrollPane.setViewportView(panel);
                            scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
                            scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

                            // Frame erzeugen
                            final JFrame frame = new JFrame("Dauerauftrag erteilen");
                            frame.setSize(450, 350);
                            frame.setResizable(false);
                            frame.setLocation(175,175);
                            frame.getContentPane().add(scrollPane);
                            // frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                            frame.setVisible(true);


                            /**
                             * ActionListener liest das Datum des Abfluges aus und
                             * übernimmt dieses in das Datumsfeld für das Ankunftsdatum
                             */
                            datefield1.addPropertyChangeListener(new PropertyChangeListener() {
                                    @Override
                                public void propertyChange(PropertyChangeEvent evt) {
                                    // Datum des Abflugtermins auslesen und in Datumsfeld für Ankunft übernehmen
                                    Object chosenDate = datefield1.getValue();
                                    datefield2.setValue(chosenDate);
                                }
                            });

                            try {
                                /**
                                 * Fluginformationen zusammenstellen und Label zuweisen
                                 */
                                FlightRealization fr = admin.getFlightRealizationById(realizationId);

                                    Flight f = admin.getFlightById(fr.getRelatedFlightId());

                                    Airline a = admin.getAirlineById(f.getAirlineId());

                                    Airport departureAirport = admin.getAirportById(f.getDepartureAirportId());

                                            String departureAirportAsString = departureAirport.getPortCity() + " (" + departureAirport.getInternationalId() + ")";

                                    Airport arrivalAirport = admin.getAirportById(f.getArrivalAirportId());

                                            String arrivalAirportAsString = arrivalAirport.getPortCity() + " (" + arrivalAirport.getInternationalId() + ")";

                                    String flightInformation1 = "Flug " + realizationId + " mit " + a.getAirName() +  ", von " + departureAirportAsString + " nach " + arrivalAirportAsString;

                                    String flightInformation2 = "Abflug: " + r.convertDateToString(fr.getDateOfDeparture()) + " um " + f.getTimeOfDeparture() + "Uhr,";

                                    String flightInformation3 = "Ankunft: " + r.convertDateToString(fr.getDateOfArrival()) + " um " + f.getTimeOfArrival() + " Uhr";

                                        String flightInformation = "<html>" + flightInformation1 + "<br>" + flightInformation2 + "<br>" + flightInformation3 + "</html>";

                                    label1.setText(flightInformation);


                                // Kundennummer (passengerId) aus JTable auslesen
                                int iSelectedRow2 = table2.getSelectedRow();
                                Object chosenPassengerId = table2.getModel().getValueAt(iSelectedRow2, 0);
                                int passengerId = Integer.parseInt(String.valueOf(chosenPassengerId));

                                    /**
                                     * Informationen zum Passagier zusammenstellen und Label zuweisen
                                     */
                                    Passenger p = admin.getPassengerById(passengerId);

                                        String passengerName = p.getFirstName() + " " + p.getLastName();

                                        String passengerStreet = p.getStreet();

                                        String passengerCity = p.getPostcode() + " " + p.getCity();

                                            String passengerInformation = "<html>" + "Passagier " + passengerId + "," + "<br>" +
                                                                                     "Name: " + passengerName + "," +  "<br>" +
                                                                                     "Anschrift: " + passengerStreet + ", " + passengerCity +
                                                                          "</html>";

                                    label2.setText(passengerInformation);

                                } catch (RemoteException ex) {
                                    System.out.println(ex);
                                }


                            // ActionListener für Button
                            button_CreateOrder.addActionListener(new ActionListener() {
                                    @Override
                                public void actionPerformed(ActionEvent e){

                                    try {
                                        // Ausgewählte Flugdurchführung (FlightRealization) auslesen
                                        int iSelectedRow1 = table1.getSelectedRow();
                                            Object chosenRealizationId = table1.getModel().getValueAt(iSelectedRow1, 0);
                                                int realizationId = Integer.parseInt(String.valueOf(chosenRealizationId));
                                                    FlightRealization fR = admin.getFlightRealizationById(realizationId);
                                                        Flight f = admin.getFlightById(fR.getRelatedFlightId());
                                        // Ausgewählten Passagier auslesen
                                        int iSelectedRow2 = table2.getSelectedRow();
                                            Object chosenPassengerId = table2.getModel().getValueAt(iSelectedRow2, 0);
                                                int passengerId = Integer.parseInt(String.valueOf(chosenPassengerId));

                                        /* Array mit Wochentagen um den Wochentag eines Dateobjektes zu ermitteln */
                                        String[] weekdays = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};

                                        /* Dateobjekt mittels Anfangsdatum (startOfOrder) des Dauerauftrages erstellen und
                                         * dessen Wochentag als String auslesen */
                                        Date startOfOrder = (Date) datefield1.getValue();
                                            int indexOfWeekdayOfStartOfOrder = startOfOrder.getDay();
                                                String weekdayOfStartOfOrder = new String(weekdays[indexOfWeekdayOfStartOfOrder]);

                                        /* Dateobjekt mittels Anfangsdatum (startOfOrder) des Dauerauftrages erstellen */
                                        Date endOfOrder = (Date) datefield2.getValue();

                                        /* Dateobjekt aus dem Abflugdatum der ausgewählten FlightRealization erstellen und
                                         * daraus den Wochentag als String auslesen */
                                        Date dateOfChosenFlightRealization = fR.getDateOfDeparture();
                                            int indexOfWeekdayOfDateOfChosenFlightRealization = dateOfChosenFlightRealization.getDay();
                                                String weekdayOfDateOfChosenFlightRealization = new String(weekdays[indexOfWeekdayOfDateOfChosenFlightRealization]);

                                        /* Prüfen ob die ausgewählte FlightRealization im ausgewählten Zeitraum liegt oder nicht */
                                        if((weekdayOfDateOfChosenFlightRealization.equals(weekdayOfStartOfOrder)) || (dateOfChosenFlightRealization.after(startOfOrder))) {
                                            if(dateOfChosenFlightRealization.before(endOfOrder)) {

                                                // Dauerauftrag erstellen
                                                admin.createStandingOrderForBookings(startOfOrder, endOfOrder, passengerId, realizationId);
                                                    // JTables aktualisieren
                                                    td.updateFlightRealization();
                                                    td.updateBooking();

                                                JOptionPane.showMessageDialog(null, "<html><p style=\"text-align: center\">" +
                                                                                    "Ihr Dauerauftrag wurde  wie gewünscht angelegt, <br>" +
                                                                                    "Sie finden die einzelnen Buchungen in der Buchungsübersicht" +
                                                                                    "</p></html>");
                                                frame.dispose();
                                                ((CardLayout) td.rightp.getLayout()).show(td.rightp,"BookingM");

                                            }
                                            else {
                                                JOptionPane.showMessageDialog(null, "<html><p style=\"color:red; text-align: center\">" +
                                                                                    "Ihr Dauerauftrag konnte nicht angelegt werden! <br>" +
                                                                                    "Ihr Auftrag endet bereits vor dem Start des ersten Fluges, <br>" +
                                                                                    "bitte prüfen Sie das Datum und versuchen Sie es erneut" +
                                                                                    "</p></html>");
                                           }
                                        }
                                        else {
                                            JOptionPane.showMessageDialog(null, "<html><p style=\"color:red; text-align: center\">" +
                                                                                "Ihr Dauerauftrag konnte nicht angelegt werden! <br>" +
                                                                                "Der von Ihnen ausgewählte Flug liegt nicht im entsprechenden Auftragszeitraum, <br>" +
                                                                                "bitte prüfen Sie das Abflugdatum ihres Fluges und versuchen Sie es erneut" +
                                                                                "</p></html>");
                                        }
                                    }
                                    catch (RemoteException ex) {
                                            System.out.println(ex);
                                    }
                                }
                            });


                            // ActionListener für Button
                            button_CloseWindow.addActionListener(new ActionListener() {
                                    @Override
                                public void actionPerformed(ActionEvent e){
                                    frame.dispose();
                                }
                            });
                        }
                    } catch (RemoteException ex) {
                        System.out.println(ex);
                    }
                }
            }
        });


        button_Cancel.addActionListener(new ActionListener() {
                @Override
        public void actionPerformed(ActionEvent e){
                    if  ((comboBox1.getSelectedItem()=="Wochentag des Fluges auswählen") ||
                         (comboBox2.getSelectedItem()=="Nachnamenbereich auswählen")) {

                        ((CardLayout) td.rightp.getLayout()).show(td.rightp,"BookingM");
                    }
                    else {
                        Object[] options = {"Ja","Nein"};
                        String txt = "Wollen Sie den Vorgang wirklich abbrechen? Hierbei" +
                        " gehen alle durchgeführten Eingaben verloren!";
                        int n = JOptionPane.showOptionDialog(td, txt, "Fluglinie anlegen",
                         JOptionPane.YES_NO_CANCEL_OPTION,
                        JOptionPane.QUESTION_MESSAGE,
                        null,
                        options,
                        options[1]);

                        if (n == 0) {
                            ((CardLayout) td.rightp.getLayout()).show(td.rightp,"BookingM");
                        }
                    }
            }
        });
    }

    
    public void updateTableData1() throws RemoteException {

        // Vector mit Daten für JTable belegen
        rowData1 = admin.getAllFlightRealizationsForTable();

        // Tabelleninhalt wird aktualisiert
        model1.setDataVector(rowData1, columnNames1);

    }

    public void updateTableData2() throws RemoteException {

        // Vector mit Daten für JTable belegen
        rowData2 = admin.getAllPassengersForTable();

        // Tabelleninhalt wird aktualisiert
        model2.setDataVector(rowData2, columnNames2);

    }

    public JPanel getJp() {
        return jp;
    }

}
